package com.imc.core.aop;

import com.imc.platform.demo.myexecption.MyException;
import com.imc.core.utils.ExceptionUtil;
import com.twp.common.tuple.ResultDTO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.ui.Model;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * controller 增强器
 */
/*
* 类描述：增强器用来辅助控制器的异常处理
* 开发者：tanweiping
* 创建日期：2018/8/7 09:58
*/
@Slf4j
@ControllerAdvice
public class ExceptionAop {

    public static final String X_REQUESTED_WIDTH="X-Requested-With";
    public static final String XML_HTTP_REQUEST="XMLHttpRequest";


    /**
     * 判断是否ajax请求.
     * 可以看到Ajax 请求多了个 x-requested-with ，可以利用它，
     * request.getHeader("x-requested-with"); 为 null，则为传统同步请求，为 XMLHttpRequest，则为Ajax 异步请求。
     *@paramrequest  HttpServletRequest
     *@return是否ajax请求.
     */
    public static boolean isAjaxRequest(HttpServletRequest request) {
        String xr=request.getHeader(X_REQUESTED_WIDTH);
        return(xr!=null&&XML_HTTP_REQUEST.equalsIgnoreCase(xr));
    }

    /**
     * 应用到所有@RequestMapping注解方法，在其执行之前初始化数据绑定器
     * @param binder
     */
    @InitBinder
    public void initBinder(WebDataBinder binder) {}

    /**
     * 把值绑定到Model中，使全局@RequestMapping可以获取到该值
     * @param model
     */
    @ModelAttribute
    public void addAttributes(Model model) {
        model.addAttribute("author", "tanweiping");
    }

    /**
     * 全局异常捕捉处理
     * @param exception
     * @return
     */
    @ResponseBody
    @ExceptionHandler(value = Exception.class)
    public Object errorHandler(Exception exception, HttpServletRequest request, HttpServletResponse response) {

        exception.printStackTrace();
         /*判断请求类型是不是ajax的*/
        //if(isAjaxRequest(request)) {
          /*如果是Ajax请求将错误信息返回到ajax date*/
            Throwable thr= ExceptionUtil.getRootCause(exception);
            ResultDTO resultDTO = ResultDTO.builder().build();

            /*如果不是自定义的错误显示系统性错误或同一错误*/
            resultDTO.setMessage(thr.getMessage());
            resultDTO.setIsSuccess(false);
            resultDTO.setCode(HttpStatus.INTERNAL_SERVER_ERROR.value());

            return resultDTO;
        //}
//        else{
//          /*如果不是Ajax的重从定向到错误界面*/
//            String page = "error";
//            if (request.getAttribute("showPage")!=null){
//                page = String.valueOf(request.getAttribute("showPage"));
//            }
//            String pageOption = "";
//            if (request.getAttribute("ModelAndView")!=null){
//                pageOption = String.valueOf(request.getAttribute("ModelAndView"));
//            }
//            return new ModelAndView(pageOption+"/"+page);
//        }
    }

}